<?php
// dirname()返回当前文件或目录的上级目录名称
define('ROOT_DIR', dirname(__DIR__)); 
define('APP_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'app');
define('PUBLIC_DIR', __DIR__);
define('VIEW_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'views');
define('STORAGE_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'storage');
define('CONFIG_DIR', ROOT_DIR . DIRECTORY_SEPARATOR . 'config');

/**
 * __autoload自动加载类魔术函数，根据类的完全限定名，影射到类文件的物理路径，实现自动载入
 */
function __autoload($className)
{
    $classFile = ROOT_DIR . DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $className) . '.php';
    require_once $classFile;
}

session_start();

/**
 * 获取action程序脚本文件url
 *
 * @param $route 路由
 * @param $params 路由参数，会拼接成查询字符串
 */
function url($route, Array $params = [])
{
   $queryString = '';
   foreach ($params as $key => $value) {
       $queryString .= $key . '=' . $value . '&';
   }
   $queryString = rtrim($queryString, '&');
   $queryString = empty($queryString) ? '' : '?' . $queryString;

   if ($_SERVER['DOCUMENT_ROOT'] == PUBLIC_DIR) {
       return 'http://' . $_SERVER['HTTP_HOST'] . '/' . $route . $queryString;
   }
   $appName = strrchr(ROOT_DIR, DIRECTORY_SEPARATOR);
   return 'http://' . $_SERVER['HTTP_HOST'] . $appName  . '/public/' . $route . $queryString;
}

/**
 * 获取资源文件（img,css,js）的url
 *
 * @param string $res 资源文件名
 */
function assets($res)
{
   // 部署到生产环境下的资源文件路径
   if ($_SERVER['DOCUMENT_ROOT'] == PUBLIC_DIR) {
      return 'http://' . $_SERVER['HTTP_HOST'] . '/' . $res;
   }
   // 本地开发环境下的资源文件路径
   $appName = strrchr(ROOT_DIR, DIRECTORY_SEPARATOR);
   return 'http://' . $_SERVER['HTTP_HOST'] . $appName  . '/public/' . $res;
}

// 生成应用程序对象容器实例
// $app = \lib\Application::getInstance();
// 加载应用程序全局配置
// require APP_DIR . DIRECTORY_SEPARATOR . 'app.php';

// 读取路由配置
$routes = require APP_DIR . DIRECTORY_SEPARATOR . 'routes.php';

// 获取当前请求的url
$url = preg_replace('/\?.*/', '', $_SERVER['REQUEST_URI']);
$route = substr($url, strpos($url, '/') + 1);

if ($_SERVER['DOCUMENT_ROOT'] != PUBLIC_DIR) {
  $segment = strrchr(ROOT_DIR, DIRECTORY_SEPARATOR) . '/public/';
  $route = substr($url, strlen($segment));
}
// 获取路由定义
$routeInfo = empty($route) ? $routes['/'] : $routes[$route];
// 判断当前请求方法
if ($_SERVER['REQUEST_METHOD'] !== strtoupper($routeInfo['method'])) {
  header('HTTP/1.1 405 Method Not Allowed');
  return;
}

$ca = explode('@', $routeInfo['action']);
$controller = 'App\\Controllers\\' .  $ca[0];
$action = $ca[1];

// 动态调用控制器中的方法
$reflectionClass = new \ReflectionClass($controller);
$reflectionMethod = new \ReflectionMethod($controller . '::' . $action);
$instance = $reflectionClass->newInstance();
$response = $reflectionMethod->invoke($instance);
if ($response instanceof \App\Lib\View) {
  $response->render();
} else {
  echo $response;
}
